home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / property / pagestartmenu.c < prev    next >
C/C++ Source or Header  |  2004-09-07  |  9KB  |  336 lines

  1. /*-------------------------------------------------------------
  2.   pagestartmenu.c : "Start menu" page of properties
  3.   (C) Kazuto Sato 1997-2003
  4.   For the license, please read readme.txt.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcprop.h"
  10.  
  11. /* Globals */
  12.  
  13. BOOL CALLBACK PageStartMenuProc(HWND hDlg, UINT message,
  14.     WPARAM wParam, LPARAM lParam);
  15.  
  16. /* Statics */
  17.  
  18. static void SendPSChanged(HWND hDlg);
  19. static void OnInit(HWND hDlg);
  20. static void OnApply(HWND hDlg);
  21. static void InitColor(HWND hDlg);
  22. static void OnDrawItem(HWND hDlg, LPDRAWITEMSTRUCT pdis);
  23. static void OnStartMenu(HWND hDlg);
  24. static void OnBrowse(HWND hDlg);
  25. static void OnChooseColor(HWND hDlg);
  26. static void SetColorFromBmp(HWND hDlg, int idCombo, const char* fname);
  27.  
  28. static char *m_section = "StartMenu";
  29. static BOOL m_bInit = FALSE;
  30. static BOOL m_bChanged = FALSE;
  31.  
  32. /*------------------------------------------------
  33.    dialog procedure of this page
  34. --------------------------------------------------*/
  35. BOOL CALLBACK PageStartMenuProc(HWND hDlg, UINT message,
  36.     WPARAM wParam, LPARAM lParam)
  37. {
  38.     switch(message)
  39.     {
  40.         case WM_INITDIALOG:
  41.             OnInit(hDlg);
  42.             return TRUE;
  43.         case WM_COMMAND:
  44.         {
  45.             WORD id, code;
  46.             id = LOWORD(wParam); code = HIWORD(wParam);
  47.             switch(id)
  48.             {
  49.                 case IDC_STARTMENU:
  50.                     OnStartMenu(hDlg);
  51.                     SendPSChanged(hDlg);
  52.                     break;
  53.                 case IDC_STARTMENUBMP:
  54.                 case IDC_STARTMENUTRANS:
  55.                     if(code == EN_CHANGE)
  56.                         SendPSChanged(hDlg);
  57.                     break;
  58.                 case IDC_STARTMENUBROWSE:
  59.                     OnBrowse(hDlg);
  60.                     break;
  61.                 case IDC_STARTMENUCOLOR:
  62.                     if(code == CBN_SELCHANGE)
  63.                         SendPSChanged(hDlg);
  64.                     break;
  65.                 case IDC_STARTMENUCHOOSECOL:
  66.                     OnChooseColor(hDlg);
  67.                     break;
  68.                 case IDC_STARTMENUTILE:
  69.                     SendPSChanged(hDlg);
  70.                     break;
  71.             }
  72.             return TRUE;
  73.         }
  74.         case WM_NOTIFY:
  75.             switch(((NMHDR *)lParam)->code)
  76.             {
  77.                 case PSN_APPLY: OnApply(hDlg); break;
  78.                 case PSN_HELP: MyHelp(GetParent(hDlg), "StartMenu"); break;
  79.             }
  80.             return TRUE;
  81.         case WM_MEASUREITEM:
  82.             // common/comobox.c
  83.             OnMeasureItemColorCombo((LPMEASUREITEMSTRUCT)lParam);
  84.             return TRUE;
  85.         case WM_DRAWITEM:
  86.             OnDrawItem(hDlg, (LPDRAWITEMSTRUCT)lParam);
  87.             return TRUE;
  88.     }
  89.     return FALSE;
  90. }
  91.  
  92. /*------------------------------------------------
  93.   notify parent window to enable "Apply" button
  94. --------------------------------------------------*/
  95. void SendPSChanged(HWND hDlg)
  96. {
  97.     if(m_bInit)
  98.     {
  99.         g_bApplyStartMenu = TRUE;
  100.         m_bChanged = TRUE;
  101.         SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)(hDlg), 0);
  102.     }
  103. }
  104.  
  105. /*------------------------------------------------
  106.   initialize
  107. --------------------------------------------------*/
  108. void OnInit(HWND hDlg)
  109. {
  110.     BOOL b;
  111.     char s[MAX_PATH], s2[MAX_PATH];
  112.     int alpha;
  113.     
  114.     m_bInit = FALSE;
  115.     
  116.     // common/tclang.c
  117.     SetDialogLanguage(hDlg, "StartMenu", g_hfontDialog);
  118.     
  119.     b = GetMyRegLong(NULL, "StartMenu", FALSE);
  120.     b = GetMyRegLong(m_section, "StartMenu", b);
  121.     CheckDlgButton(hDlg, IDC_STARTMENU, b);
  122.     
  123.     GetMyRegStr(NULL, "StartMenuBmp", s, MAX_PATH, "");
  124.     GetMyRegStr(m_section, "Bitmap", s2, MAX_PATH, s);
  125.     SetDlgItemText(hDlg, IDC_STARTMENUBMP, s2);
  126.     
  127.     InitColor(hDlg);
  128.     
  129.     b = GetMyRegLong(NULL, "StartMenuTile", FALSE);
  130.     b = GetMyRegLong(m_section, "Tile", b);
  131.     CheckDlgButton(hDlg, IDC_STARTMENUTILE, b);
  132.     
  133.     OnStartMenu(hDlg);
  134.     
  135.     UpDown_SetBuddy(hDlg, IDC_STARTMENUTRANSSPIN, IDC_STARTMENUTRANS);
  136.     UpDown_SetRange(hDlg, IDC_STARTMENUTRANSSPIN, 100, 0);
  137.     
  138.     alpha = GetMyRegLong(NULL, "AlphaStartMenu", 0);
  139.     alpha = GetMyRegLong(m_section, "Alpha", alpha);
  140.     if(alpha < 0) alpha = 0; else if(alpha > 100) alpha = 100;
  141.     UpDown_SetPos(hDlg, IDC_STARTMENUTRANSSPIN, alpha);
  142.     
  143.     if(!(g_winver&WIN2000))
  144.     {
  145.         int i;
  146.         for(i = IDC_STARTMENUTRANSLAB; i <= IDC_STARTMENUTRANSSPIN; i++)
  147.             EnableDlgItem(hDlg, i, FALSE);
  148.     }
  149.     
  150.     m_bInit = TRUE;
  151. }
  152.  
  153. /*------------------------------------------------
  154.   Apply changes
  155. --------------------------------------------------*/
  156. void OnApply(HWND hDlg)
  157. {
  158.     char s[MAX_PATH];
  159.     
  160.     if(!m_bChanged) return;
  161.     m_bChanged = FALSE;
  162.     
  163.     DelMyReg(NULL, "StartMenu");
  164.     SetMyRegLong(m_section, "StartMenu",
  165.         IsDlgButtonChecked(hDlg, IDC_STARTMENU));
  166.     
  167.     DelMyReg(NULL, "StartMenuBmp");
  168.     GetDlgItemText(hDlg, IDC_STARTMENUBMP, s, MAX_PATH);
  169.     SetMyRegStr(m_section, "Bitmap", s);
  170.     
  171.     DelMyReg(NULL, "StartMenuCol");
  172.     SetMyRegLong(m_section, "Color",
  173.         CBGetItemData(hDlg, IDC_STARTMENUCOLOR,
  174.             CBGetCurSel(hDlg, IDC_STARTMENUCOLOR)));
  175.     
  176.     DelMyReg(NULL, "StartMenuTile");
  177.     SetMyRegLong(m_section, "Tile",
  178.         IsDlgButtonChecked(hDlg, IDC_STARTMENUTILE));
  179.     
  180.     DelMyReg(NULL, "AlphaStartMenu");
  181.     SetMyRegLong(m_section, "Alpha",
  182.         UpDown_GetPos(hDlg, IDC_STARTMENUTRANSSPIN));
  183. }
  184.  
  185. /*------------------------------------------------
  186.    initizlize "Color" comoboxes
  187. --------------------------------------------------*/
  188. void InitColor(HWND hDlg)
  189. {
  190.     COLORREF colDef;
  191.     
  192.     colDef = GetMyRegLong(NULL, "StartMenuCol",
  193.         0x80000000 | COLOR_BTNTEXT);
  194.     colDef = GetMyRegLong(m_section, "Color", colDef);
  195.     InitColorCombo(hDlg, IDC_STARTMENUCOLOR, NULL, 0, colDef);
  196. }
  197.  
  198. /*------------------------------------------------
  199.   WM_DRAWITEM message
  200. --------------------------------------------------*/
  201. void OnDrawItem(HWND hDlg, LPDRAWITEMSTRUCT pdis)
  202. {
  203.     // common/comobox.c
  204.     OnDrawItemColorCombo(pdis, NULL);
  205. }
  206.  
  207. /*------------------------------------------------
  208.    "Customize Start menu" is checked
  209. --------------------------------------------------*/
  210. void OnStartMenu(HWND hDlg)
  211. {
  212.     HWND hwnd;
  213.     BOOL b;
  214.     
  215.     b = IsDlgButtonChecked(hDlg, IDC_STARTMENU);
  216.     
  217.     hwnd = GetDlgItem(hDlg, IDC_STARTMENU);
  218.     hwnd = GetWindow(hwnd, GW_HWNDNEXT);
  219.     while(hwnd)
  220.     {
  221.         EnableWindow(hwnd, b);
  222.         if(GetDlgCtrlID(hwnd) == IDC_STARTMENUCHOOSECOL) break;
  223.         hwnd = GetWindow(hwnd, GW_HWNDNEXT);
  224.     }
  225. }
  226.  
  227. /*------------------------------------------------
  228.   browse bitmap file
  229. --------------------------------------------------*/
  230. void OnBrowse(HWND hDlg)
  231. {
  232.     char *filter = "Bitmap (*.bmp)\0*.bmp\0\0";
  233.     char deffile[MAX_PATH], fname[MAX_PATH];
  234.     
  235.     GetDlgItemText(hDlg, IDC_STARTMENUBMP, deffile, MAX_PATH);
  236.     
  237.     // select file : common/selectfile.c
  238.     if(!SelectMyFile(g_hInst, hDlg, filter, 0, deffile, fname))
  239.         return;
  240.     
  241.     SetColorFromBmp(hDlg, IDC_STARTMENUCOLOR, fname);
  242.     
  243.     SetDlgItemText(hDlg, IDC_STARTMENUBMP, fname);
  244.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  245.     SendPSChanged(hDlg);
  246. }
  247.  
  248. /*------------------------------------------------
  249.   choose color
  250. --------------------------------------------------*/
  251. void OnChooseColor(HWND hDlg)
  252. {
  253.     // common/combobox.c
  254.     ChooseColorWithCombo(g_hInst, hDlg, IDC_STARTMENUCOLOR);
  255.     
  256.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  257.     SendPSChanged(hDlg);
  258. }
  259.  
  260. /*------------------------------------------------
  261.    Select "Color" combo box automatically.
  262. --------------------------------------------------*/
  263. #define WIDTHBYTES(i) ((i+31)/32*4)
  264.  
  265. void SetColorFromBmp(HWND hDlg, int idCombo, const char* fname)
  266. {
  267.     HFILE hf;
  268.     BITMAPFILEHEADER bmfh;
  269.     BITMAPINFOHEADER bmih;
  270.     int numColors;
  271.     BYTE pixel[3];
  272.     COLORREF col;
  273.     int i, index;
  274.     
  275.     hf = _lopen(fname, OF_READ);
  276.     if(hf == HFILE_ERROR) return;
  277.     
  278.     if(_lread(hf, &bmfh, sizeof(bmfh)) != sizeof(bmfh) ||
  279.         bmfh.bfType != *(WORD*)"BM" ||
  280.         _lread(hf, &bmih, sizeof(bmih)) != sizeof(bmih) ||
  281.         bmih.biSize != sizeof(bmih) ||
  282.         bmih.biCompression != BI_RGB ||
  283.         !(bmih.biBitCount <= 8 || bmih.biBitCount == 24))
  284.     {
  285.         _lclose(hf); return;
  286.     }
  287.     numColors = bmih.biClrUsed;
  288.     if(numColors == 0)
  289.     {
  290.         if(bmih.biBitCount <= 8) numColors = 1 << bmih.biBitCount;
  291.         else numColors = 0;
  292.     }
  293.     if(numColors > 0 &&
  294.         _llseek(hf, sizeof(RGBQUAD)*numColors, FILE_CURRENT) == HFILE_ERROR)
  295.     {
  296.         _lclose(hf); return;
  297.     }
  298.     if(_llseek(hf,
  299.             WIDTHBYTES(bmih.biWidth*bmih.biBitCount)*(bmih.biHeight-1),
  300.             FILE_CURRENT) == HFILE_ERROR ||
  301.         _lread(hf, pixel, sizeof(pixel)) != sizeof(pixel))
  302.     {
  303.         _lclose(hf); return;
  304.     }
  305.     if(bmih.biBitCount < 24)
  306.     {
  307.         index = -1;
  308.         if(bmih.biBitCount == 8) index = pixel[0];
  309.         else if(bmih.biBitCount == 4)
  310.             index = (pixel[0] & 0xF0) >> 4;
  311.         else if(bmih.biBitCount == 1)
  312.             index = (pixel[0] & 0x80) >> 7;
  313.         if(_llseek(hf, sizeof(bmfh)+sizeof(bmih)+sizeof(RGBQUAD)*index,
  314.             FILE_BEGIN) == HFILE_ERROR ||
  315.             _lread(hf, pixel, sizeof(pixel)) != sizeof(pixel))
  316.         {
  317.             index = -1;
  318.         }
  319.     }
  320.     _lclose(hf);
  321.     if(index == -1) return;
  322.     col = RGB(pixel[2], pixel[1], pixel[0]);
  323.     
  324.     for(i = 0; i < 16; i++)
  325.     {
  326.         if(col == (COLORREF)CBGetItemData(hDlg, idCombo, i)) break;
  327.     }
  328.     if(i == 16)
  329.     {
  330.         if(CBGetCount(hDlg, idCombo) == 16)
  331.             CBAddString(hDlg, idCombo, col);
  332.         else CBSetItemData(hDlg, idCombo, 16, col);
  333.     }
  334.     CBSetCurSel(hDlg, idCombo, i);
  335. }
  336.